// 1. 异步编程主要目的是为了解决js单线程问题， 在处理需要等待时间的任务时， 统一放在同步任务之后处理， 避免
// 程序一直处于等待状态。
// 2. eventloop是js处理事件的一种机制， 从script开始， 主进程遇到非函数事件时， 直接进栈出栈执行，
// 遇到宏任务就会在eventTable注册， 当达到触发条件后， 就加入的消息队列等待执行， 遇到微任务加入事件队列等待执行。
// 主进程遇到函数事件时， 会把函数压入执行栈底部， 函数内如果还有函数， 同步函数继续压栈， 宏或微加入队列等待执行。
// 当执行栈中没有同步任务后， 就会执行微任务队列中的任务， 如果微任务中也有同步或者异步任务，
// 则分别再加入执行栈和消息队列， 并且遵循同步 - 微任务 - 宏任务的顺序。 当微任务队列清空以后，
// 就会执行消息队列中的宏任务， 宏任务中有同步异步任务， 也是压栈或加队列， 这种往复循环就是eventloop。
// 3. 消息队列是用来存储等待执行的宏任务的队列， 在同步任务与微任务执行结束以后， 就会执行消息队列里面的任务
// 4. 宏任务是基于BOM或DOM发起的任务， 微任务是基于js引擎发起的任务
// 5. 改写promise
new Promise((resolve, reject) => {
		setTimeout(() => resolve('hello'), 10)
	})
	.then((a) => {
		return new Promise((resolve, reject) => {
			setTimeout(() => resolve([a, 'lagou']), 10)
		})
	})
	.then((list) => {
		var c = "i ❤  u";
		console.log(list[0] + list[1] + c)
	})
//练习1
const cars = [{
	name: 'car1',
	horsepower: 660,
	dollar_value: 1,
	in_stock: true
}, {
	name: 'car2',
	horsepower: 770,
	dollar_value: 2,
	in_stock: false
}]
let isLastInStock = fp.flowRight(fp.prop('in_stock'), fp.last);
console.log(isLastInStock(cars))
//练习2
let firstName = fp.flowRight(fp.prop('name'), fp.first)
console.log(firstName(cars))
//练习3
let _average = function(xs) {
	return fp.reduce(fp.add, 0, xs) / xs.length
}
var averageDollarValue = fp.flowRight(_average, fp.map(fp.prop('dollar_value')));
console.log(averageDollarValue(cars))
//练习4----为什么World2x会变成hello_world_2_x？
let _underscore = fp.replace(/\W+/g, '_');
let sanitizeNames = fp.flowRight(fp.map(_underscore), fp.map(fp.lowerCase));
console.log(sanitizeNames(['Hello World', 'Hello World2x']))

//函子作业
//练习1
let ex1 = (x) => {
	return fp.map(fp.add(1))(x)
}
let maybe = Maybe.of([5, 6, 1]).map(ex1);
console.log(maybe._value)
//练习2
let ex2 = (x) => {
	return fp.first(x)
}
let xs = Container.of(['a', 'b', 'c']).map(ex2)
console.log(xs._value)
//练习3
let user = {
	id: 2,
	name: 'albert'
};
let ex3 = (x) => {
	return fp.first(x)
}
let safeProp = fp.curry((x, o) => Maybe.of(o[x]));
console.log(safeProp('name', user).map(ex3))
//练习4
var parseNum = Maybe.of(null).map(parseInt)
console.log(parseNum)
var parseNum = Maybe.of(4.4).map(parseInt)
console.log(parseNum)
